<?php
namespace bytefly\yii2common\widgets\modal;

use yii\base\View;
use yii\bootstrap4\Html;
use yii\helpers\Url;

class ModalViewHelper {
    
    // 这地方写的是文件系统路径，不是名字空间
    const ModalViewPath = '@vendor/bytefly/yii2common/src/widgets/modal/common';


    /**
     * 仅仅渲染一个空的 Modal 本体
     * Modal 的内容，需要根据触发按钮的 'url' 属性来动态加载。
     * 
     * 触发 Modal 对话框的按钮要单独渲染，可以是一个，或多个：
     * echo Html::a('弹出窗体', '#', [
     *    'data-toggle' => 'modal',
     *    'data-target' => '#update-ambience',
     *    'data-bf-url' => AppHelper::makeUrl(['/ambience/update', 'id' => $model->id]),
     *    'data-bf-title' => Yii::t('app', 'Update Ambience'),
     * ]);
     * 
     * - 'data-target' 要跟下面 $params['modalId'] 保持一致；
     * - 'data-bf-url' 用来生成动态内容，必须是完整的相对路径或绝对路径，不能是数组形式
     *
     * @param View $view
     * @param array $params 传递给位于 ModalViewPath 路径的视图文件的参数，目前支持 modalId(必填), scrollable, size
     * @return string
     */
    public static function renderModal(View $view, $params = []){
        return $view->render(self::ModalViewPath, $params);
    }

    /**
     * 渲染模态框触发按钮，并根据参数提前渲染出来模态框本体（内容 content 还是要靠 url 动态获取）
     *
     * @param string $title 按钮标题
     * @param string|array $url 动态内容获取链接
     * @param View $view 当前进行渲染的 View 对象，一般在视图文件里传 $this 即可
     * @param array $options 
     * [
     *      'data-target' => 可填：模态框 ID，不带 `#` 前缀的，同一界面生成多个时去重用，如果页面中只有一个，可以忽略，会自动生成一个默认的,
     *      'class' => 选填：自定义按钮的 class 属性，默认是 'btn btn-primary btn-sm',
     *      'title' => 选填：模态框标题，默认使用跟按钮相同的标题,
     *      'modal-options' => 选填：数组，传递给模态框的参数都在这里，支持 'scrollable', 'size' 属性
     * ]
     * @return string
     */
    public static function renderModalButton($title, $url, View $view, $options){
        $modalId = $options['data-target'] ?? null;
        if ($modalId == null){
            $modalId = 'modal-' . \Yii::$app->security->generateRandomString(6);
        }

        // 渲染按钮
        $btn = Html::a($title, '#', [
            'class' => $options['class'] ?? 'btn btn-primary btn-sm',
            'data-toggle' => 'modal',
            'data-target' => '#' . $modalId,
            'data-bf-title' => $options['title'] ?? $title,
            'data-bf-url' => Url::to($url),
        ]);

        // 渲染模态框本框
        $modalOptions = $options['modal-options'] ?? [];
        $modalOptions['modalId'] = $modalId;
        $modal = $view->render(self::ModalViewPath, $modalOptions);

        return $btn . $modal;
    }    
}
?>